/**
*
* ContactMe
* https://www.21tools.it
*
*/
var lang;
// Read languages
jQuery.getJSON(cm_lang_path, function(data) {
lang = data;
});
(function($) {
// More then one form allowed
$('.contactMe').each(function(index) {
var $form = $(this),
$msg = $form.find('.msg'),
$submitBtn = $form.find('button[type=submit]');
// Handle Form Submit
$form.submit(function(e) {
// prevent form submit
e.preventDefault();
// Prevent double submission by disabling the submit button
$submitBtn.html($submitBtn.data('sending')).attr('disabled', 'disabled');
// Hide previous messages
$msg.fadeOut(0);
// Validate the Form Data
var validate = validateForm($form);
if (!validate.success)
{
if (validate.errors.length > 0)
{
showMessage($msg, errorsArrayToHtml(validate.errors), 'error');
// Re-enable submit button
$submitBtn.html($submitBtn.data('text')).removeAttr('disabled');
return null;
}
}
if (typeof(grecaptcha) != 'undefined' && $form.find('.re-captcha').length > 0 && $form.find('.re-captcha').hasClass('invisible'))
{
if(!grecaptcha.execute($form.find('.re-captcha').data('grecaptcha')))
{
// Re-enable submit button
$submitBtn.html($submitBtn.data('text')).removeAttr('disabled');
return null;
}
}
else {
// If reCAPTCHA V2 is enabled, check also if is checked
if (typeof(grecaptcha) != 'undefined' && $form.find('.re-captcha').length > 0 && !$form.find('.re-captcha').hasClass('invisible'))
{
if (grecaptcha.getResponse($form.find('.re-captcha').data('grecaptcha')) == "")
{
showMessage($msg, lang.recaptcha.empty, 'error');
// Re-enable submit button
$submitBtn.html($submitBtn.data('text')).removeAttr('disabled');
return null;
}
}
submitAjaxForm($form);
}
});
$submitBtn.attr('data-text', $submitBtn.html());
});
var count = 0;
$('.contactMe .form-row.file').each(function(index) {
$(this).find('input').attr('id', 'cm_upload_' + count);
$(this).find('label').attr('for', 'cm_upload_' + count);
$(this).on('change', function(e)
{
var fileName = '',
labelHtml = '' + $(e.target).attr('placeholder');
if(e.target.files && e.target.files.length > 1)
fileName = (e.target.getAttribute('data-multiple-label') || '').replace('{count}', e.target.files.length);
else if(e.target.value)
fileName = e.target.value.split('\\').pop();
if(fileName)
$(e.target).find('+ label').html('' + fileName).addClass('selected');
else
$(e.target).find('+ label').html(labelHtml).removeClass('selected');
});
count++;
});
// Allow tab navigation on select2 dropdowns
$(document).on('focus', '.select2', function(e) {
if (e.originalEvent) {
$(this).siblings('select').select2('open');
}
});
// Convert all select dropdowns into "Select2" dropdowns
if(typeof($.fn.select2) != 'undefined') {
$('.contactMe select').each(function(index) {
var placeholder = $(this).attr('placeholder');
$(this).select2({
minimumResultsForSearch:-1,
placeholder:placeholder,
language:cm_dropdown_lang,
allowClear:true
});
});
}
if(typeof($.fn.datepicker) != 'undefined') {
$('.contactMe .cm-date').attr('readonly', 'true').datepicker({
format: 'dd-mm-yy',
maxViewMode: 2,
clearBtn: true,
language: cm_datepicker_lang,
orientation: 'bottom auto',
keyboardNavigation: false,
autoclose: true,
todayHighlight: true,
enableOnReadonly: true
}).on('hide', function(e) {
$(this).blur();
});
$('.contactMe .cm-date[data-idconnecteddateend], .contactMe .cm-date[data-idconnecteddatestart]').on('changeDate', function(e) {
updateConnectedDatePickers($(this));
});
}
if(typeof($.fn.timepicker) != 'undefined') {
$('.contactMe .cm-time').timepicker({
timeFormat:'h:i A',
step:30,
scrollDefault:'now',
disableTouchKeyboard:true,
stopScrollPropagation:true
});
}
}(jQuery));
/* Functions */
/* Update Connected Date Pickers Start->End */
function updateConnectedDatePickers(obj) {
var startDate = null;
var endDate = null;
if(typeof obj.data('idconnecteddateend') != 'undefined') {
startDate = obj;
endDate = jQuery('#' + obj.data('idconnecteddateend'));
if(startDate.val()) {
var formattedStartDate = new Date(startDate.datepicker("getDate"));
var d = formattedStartDate.getDate();
if(d < 10) {
d = "0" + d;
}
var m = formattedStartDate.getMonth() + 1;
if(m < 10) {
m = "0" + m;
}
var y = formattedStartDate.getFullYear();
var tmpEndDate = endDate.datepicker("getDate");
endDate.datepicker("setStartDate", d + "/" + m + "/" + y);
endDate.datepicker("update", tmpEndDate);
if(endDate.val() && formattedStartDate > endDate.datepicker("getDate")) {
endDate.datepicker("update", "");
}
}
else {
var tmpEndDate = endDate.datepicker("getDate");
endDate.datepicker("setStartDate", "");
endDate.datepicker("update", tmpEndDate);
}
}
else {
startDate = jQuery('#' + obj.data('idconnecteddatestart'));
endDate = obj;
}
}
/* Validate a form */
function validateForm($form)
{
var $msg = $form.find('.msg'),
errors = [],
success = true;
// Loop through fields
$form.find('.field').each(function(index) {
var err = validateField(jQuery(this));
if(err != null) { errors.push(err); }
});
// Check if there're errors
if (errors.length > 0) {
success = false;
}
return {success:success, errors:errors};
}
/* Validate a single field */
function validateField($field)
{
var type = $field.prop('type'),
displayName = $field.data('displayname'),
value = $field.val(),
msg = null;
// Check if is required
if($field.prop('required') && $field.val() === '') {
msg = paramsIntoString(lang.required_field, [displayName]);
return msg;
}
else if($field.val() === '') {
return null;
}
// Check the type
switch(type) {
case 'email':
var atIndex = value.indexOf("@"),
dotIndex = value.lastIndexOf(".");
if (atIndex < 1 || dotIndex < 1 || dotIndex < atIndex || dotIndex >= value.length ) {
msg = paramsIntoString(lang.email_invalid, [displayName]);
return msg;
}
break;
case 'number':
case 'tel':
if (!jQuery.isNumeric(value)) {
msg = paramsIntoString(lang.number_invalid, [displayName]);
return msg;
}
break;
case 'file':
if (typeof $field.data('allowedtypes') != 'undefined' && $field[0].files.length > 0) {
var arrTypes = jQuery.map($field.data('allowedtypes').split(','), function(value){
return value.trim().toLowerCase();
});
jQuery.each($field[0].files, function(index, value){
var tmpType = value.name.trim().toLowerCase().split('.').pop();
if (jQuery.inArray(tmpType, arrTypes) == -1) {
msg = paramsIntoString(lang.file.type, [value.name]);
return;
}
});
if (msg != null) {
return msg;
}
}
break;
}
return null;
}
/* Replace params into string */
function paramsIntoString(string, params)
{
var i;
for (i = 0; i < params.length; i++) {
string = string.replace("{{" + (i+1) + "}}", params[i]);
}
return string;
}
/* Create html from errors array */
function errorsArrayToHtml(errors)
{
var resultHtml = "";
for (var i = 0; i < errors.length; i++) {
resultHtml += errors[i] + "
";
}
return resultHtml;
}
/* Show Form Messages */
function showMessage($msg, html, type)
{
$msg.html(html).removeClass('error success').addClass(type).fadeIn(400);
}
/* Reset a Form */
function resetForm($form, time)
{
var time_anim = time > 0 ? 400 : 0;
$form[0].reset();
if(typeof(jQuery.fn.select2) != 'undefined') {
$form.find('select').select2('val', {});
}
$form.find('.form-row.file input').trigger('change');
if(typeof(grecaptcha) != 'undefined' && $form.find('.re-captcha').length > 0) {
grecaptcha.reset($form.find('.re-captcha').data('grecaptcha'));
}
setTimeout(function() {
$form.find('.msg').fadeOut(time_anim).html('').removeClass('error success');
}, time);
}
/* Google reCAPTCHA functions */
function initRecaptchas()
{
jQuery('.contactMe .re-captcha').each(function(index) {
var thisElem = jQuery(this)[0];
var sitekey = jQuery(this).data('sitekey');
if(jQuery(this).hasClass('invisible')) {
jQuery(this).data('grecaptcha',
grecaptcha.render(thisElem, {
'sitekey': sitekey,
'badge': 'inline',
'size': 'invisible',
'callback': 'callbackRecaptcha'
})
);
}
else {
jQuery(this).data('grecaptcha',
grecaptcha.render(thisElem, {
'sitekey': sitekey,
'theme': 'light',
'size': 'normal'
})
);
}
});
}
function callbackRecaptcha(token)
{
var $recaptcha = null;
jQuery('.g-recaptcha-response').each(function(index) {
if(jQuery(this).val() == token) {
$recaptcha = jQuery(this);
}
return ($recaptcha == null);
});
if($recaptcha != null) {
submitAjaxForm($recaptcha.closest('form'));
}
}
/* Submit the Form */
function submitAjaxForm($form)
{
var $msg = $form.find('.msg'),
$submitBtn = $form.find('button[type=submit]'),
submitBtnTxt = $submitBtn.data('text'),
action = $form.prop('action');
// Prevent double submission by disabling the submit button
$submitBtn.html($submitBtn.data('sending')).attr('disabled', 'disabled');
var formData = new FormData();
for (es = new FormData($form[0]).entries(); !(e = es.next()).done && (pair = e.value);) {
if(typeof(pair[1].name) != 'undefined' && pair[1].name == '') {
continue;
}
formData.append(pair[0], pair[1]);
}
// Send informations
jQuery.ajax({
url: action,
type: 'POST',
dataType: 'json',
data: formData,
cache: false,
enctype: 'multipart/form-data',
processData: false,
contentType: false,
success: function(data)
{
if(data.errors) {
// Show errors
showMessage($msg, errorsArrayToHtml(data.errors), 'error');
if(typeof(grecaptcha) != 'undefined' && $form.find('.re-captcha').length > 0) {
grecaptcha.reset($form.find('.re-captcha').data('grecaptcha'));
}
// Re-enable submit button
$submitBtn.html(submitBtnTxt).removeAttr('disabled');
return null;
}
else if(data.success) {
// Show success message
showMessage($msg, data.success, 'success');
resetForm($form, 6000);
// Re-enable submit button
$submitBtn.html(submitBtnTxt).removeAttr('disabled');
}
else if(data.redirectUrl) {
window.location.href = data.redirectUrl;
}
else {
window.location.reload();
}
},
error: function(data)
{
// Something went wrong
showMessage($msg, lang.something_wrong, 'error');
if(typeof(grecaptcha) != 'undefined' && $form.find('.re-captcha').length > 0) {
grecaptcha.reset($form.find('.re-captcha').data('grecaptcha'));
}
// Re-enable submit button
$submitBtn.html(submitBtnTxt).removeAttr('disabled');
}
});
}